﻿using MediatR;

namespace WebAPI中介者模式示例
{
    // 4. 创建命令
    public class ProductService : IRequestHandler<CreateProductCommand, ProductResult>
    {
        private readonly IMediator _mediator;

        // 只依赖中介者，不直接依赖库存服务
        public ProductService(IMediator mediator)
        {
            _mediator = mediator;
        }

        public async Task<ProductResult> Handle(CreateProductCommand request, CancellationToken cancellationToken)
        {
            // 模拟创建产品

            var productId = new Random().Next(1000, 9999);
            Console.WriteLine($"产品服务：已创建产品 #{productId}，名称：{request.Name}，价格：{request.Price}");

            // 通过中介者发布事件，通知其他服务（不需要知道谁会处理）
            await _mediator.Publish(new OrderCreatedEvent
            {
                OrderId = productId,
                ProductId = request.ProductId,
                Quantity = request.Quantity
            }, cancellationToken);


            return new ProductResult
            {
                Success = true,
                Message = "订单创建成功",
                OrderId = productId
            };
        }
    }

    // 5. 处理订单创建事件
    public class MyInventoryService : INotificationHandler<CreateProductEvent>
    {
        // 只依赖中介者，不直接依赖订单服务
        public Task Handle(CreateProductEvent notification, CancellationToken cancellationToken)
        {
            // 模拟更新库存
            Console.WriteLine($"库存服务：收到订单 #{notification.OrderId} 通知，正在减少产品 {notification.ProductId} 库存，数量：{notification.Quantity}");
            return Task.CompletedTask;
        }
    }

    // 6. 处理订单创建事件（展示中介者的多订阅者能力）
    public class MyShippingService : INotificationHandler<CreateProductEvent>
    {
        public Task Handle(CreateProductEvent notification, CancellationToken cancellationToken)
        {
            // 模拟安排物流
            Console.WriteLine($"物流服务：收到订单 #{notification.OrderId} 通知，正在安排发货");
            return Task.CompletedTask;
        }
    }


    // 发送已发货短信
    public class MySendMessageService : INotificationHandler<CreateProductEvent>
    {
        public Task Handle(CreateProductEvent notification, CancellationToken cancellationToken)
        {
            // 模拟安排物流
            Console.WriteLine($"短信服务：收到订单 #{notification.OrderId} 通知，请注意查收");
            return Task.CompletedTask;
        }
    }
}
